package com.zhida.common.utils;

import io.jsonwebtoken.*;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static com.zhida.common.utils.StaticKeyUtil.TOKEN_EXPIRE_TIME;

/**
 * 生成token
 */


@Component
public class TokenProcessor {

    private static final long EXPIRE_TIME=60*60*1000*24; //过期时间7天
    private static final String KEY = "zhiDa"; //加密秘钥

    /**
     * 生成token
     * 由于只有当账号密码正确之后才会生成token所以这边只需要用户名进行识别
     * @param userName  用户名
     * @return
     */
    public static String createToken(String userName){
        Map<String,Object> header = new HashMap();
        header.put("typ","JWT");
        header.put("alg","HS256");
        JwtBuilder builder = Jwts.builder().setHeader(header)
                .setExpiration(new Date(System.currentTimeMillis()+ TOKEN_EXPIRE_TIME * EXPIRE_TIME))
                .setSubject(userName)//设置信息，也就是用户名
                .setIssuedAt(new Date())
                .signWith(SignatureAlgorithm.HS256,KEY);//加密方式
        return builder.compact();
    }
    /**
     * 验证token是否有效
     * @param token  请求头中携带的token
     * @return  token验证结果  2-token过期；1-token认证通过；0-token认证失败
     */
    public static int verify(String token){
        Claims claims = null;
        try {
            //token过期后，会抛出ExpiredJwtException 异常，通过这个来判定token过期，
            claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
        }catch (ExpiredJwtException e){
            return 2;
        }
        //从token中获取用户名，当用户查询通过后即可
        String username = claims.getSubject();

        if (username != null){
            return 1;
        }else {
            return 0;
        }
    }

    /****
     * 根据token获取用户名
     * @param token
     * @return
     */
    public static String getUserByToken(String token){
        Claims claims = null;
        try {
            //token过期后，会抛出ExpiredJwtException 异常，通过这个来判定token过期，
            claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();
        }catch (ExpiredJwtException e){
            return null;
        }
        //从token中获取用户名，当用户查询通过后即可
        return claims.getSubject();
    }

    public static String getUsername(HttpServletRequest request){
        String token = request.getHeader("token");
        Claims claims = null;
        try {
            //token过期后，会抛出ExpiredJwtException 异常，通过这个来判定token过期，
            claims = Jwts.parser().setSigningKey(KEY).parseClaimsJws(token).getBody();

        }catch (Exception e){
            System.out.println("TokenProcessor->getUsername异常：Token不存在");
            return null;
        }
        //从token中获取用户名，当用户查询通过后即可
        return claims.getSubject();
    }
}


